package cn.tedu.thread;
/**本类用于多线程编程实现方案一*/
public class TestThread1 {
    public static void main(String[] args) {
        MyThread t=new MyThread();
        MyThread t2=new MyThread();
        MyThread t3=new MyThread();
        MyThread t4=new MyThread();
        /**如果只是通过线程对象调用run（）方法，那么会先执行完一个线程的任务
         * 再执行另外一个线程的任务，根本不会以多线程的方式启动，所以就没有多线程抢占资源的效果*/
//        t.run();
//        t2.run();
        /**start()对应的状态是线程的就绪状态，至于什么时候执行，取决于什么时候被os选中
         * 当我们调用start()启动线程时，底层虚拟机会自动调用run（）执行我们的业务
         * 如果想让程序有多线程的效果，需要创建多个线程对象，并且调用start
         * 将线程加入到就绪队列中才可以，调用run()只能当作普通方法调用，没有多线程的效果
         * 线程执行的效果具有随机性，也就是说t1 t2 t3的执行结果是不可控制的
         * 具体执行取决于cpu的调度，时间片的分配，我们控制不了*/

        t.start();
        t2.start();
        t3.start();
        t4.start();

        MyThread t5=new MyThread("大连");
        t5.start();
    }
}
/**1.方式一：通过继承的方式：extends Thread*/
class MyThread extends Thread{
    //添加自定义类的无参构造
    public MyThread(){//需要手动添加无参构造
        super();
    }

    public MyThread(String name) {
        super(name);
    }

    /**为了修改线程的名称，可以提供一个含参构造
     * 子类调用了父类的构造函数，super(name);*/

    @Override
    public void run() {
        /**2.自定义线程类的业务需要写在重写的run（）里
         * 3.super.run()表示调用的是父类的业务，注释掉不用*/
//        super.run();
        for (int i = 0; i < 30; i++) {
            /**getName()表示可以获取当前正在执行的线程名称
             * 父类的方法直接使用*/
            System.out.println(i+"="+getName());
        }
    }
}
